package com.xxx.ticket;

import java.util.concurrent.locks.ReentrantLock;

/**
 * @version v1.0
 * @Description:
 * @Author zhanzhongxin
 * @Date 2021/7/30 13:47
 * @Copyright 博为峰
 */

//线程任务类

/*
  synchronized(对象){//锁
     被同步的代码（有可能出现线程安全问题的代码）
  }

  锁:
  偏向锁
  轻量锁
  重量锁 synchronized
  公平锁
  非公平锁
  悲观锁
  乐观锁

 */
public class Ticket03 implements Runnable {

    public static int num = 100;
    public static boolean flag = true;
    public Object obj = new Object();
    public ReentrantLock lock = new ReentrantLock();//非公平锁，公平锁（true）

    /*
        Lock:显示锁（获取，释放），只能应用于代码块
        synchronized:隐士锁(自动)，可以应用于代码块和方法
     */

    @Override
    public void run() {
        while (flag) {//num = 1  0 -1
            lock.lock();//获取锁
            try {
                saleTicket();
            } finally {
                lock.unlock();//释放锁
            }
        }
    }

    private void saleTicket() {
        if (num > 0) {
            try {
                Thread.sleep(100);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            System.out.println(Thread.currentThread().getName() + "," + num--);
        } else {
            flag = false;
        }
    }
}
